const axios = require('axios');

// 使用axios发起请求
function getData (url, params) {
  return new Promise((resolve, reject) => {
    axios.get(url, {
      params: params
    }).then(res => {
      resolve(res.data);
    }).catch(err => {
      reject(err.data);
    });
  });
}

// 获得请求地址
function getUrl (str) {
  const regex = /rank_url.*?(\d+\.txt)/m;
  // https://www.qschina.cn/sites/default/files/qs-rankings-data/cn/2005378.txt
  let m;
  let baseUrl = 'https://www.qschina.cn/sites/default/files/qs-rankings-data/cn/';

  if ((m = regex.exec(str)) !== null) {
    // console.log(baseUrl + m[1]);
  }
  console.log(baseUrl + m[1]);
  return baseUrl + m[1];
}

// 获取大学名称
function getUniversityTitle (str) {
  const regex = /<div.*?link">(.*?)<\/a><\/div>/;
  let m;
  if ((m = regex.exec(str)) !== null) {
    // console.log(m[1]);
    return m[1];
  }
}

// 提取数据
function getDataList (year, data) {
  let dataList = [];
  for (const item in data) {
    let university = getUniversityTitle(data[item].title);
    let score = data[item].score;
    let rank = data[item].rank_display;
    dataList.push({
      year,
      university,
      score,
      rank
    });
    // console.log(dataList[item]);
  }
  return dataList;
}

// 写入CSV首行信息
function writeCSVHead (head) {
  const fs = require('fs');
  const writeStream = fs.createWriteStream('test.csv');
  // 写入csv首行信息
  writeStream.write(head);
}

// 写入数据
function writeCSV (data) {
  const fs = require('fs');
  const writeStream = fs.createWriteStream('test.csv', { flags: 'a' });
  for (const key in data) {
    rank = getRank(data[key]['rank']);
    writeStream.write(`${data[key]['year']},${data[key]['university']},${data[key]['score']},${rank}\n`);
  }
  writeStream.close();
}

// 生成历年排名页面地址
function getRankUrls () {
  let rankUrls = [];
  for (let index = 2017; index <= 2020; index++) {
    let url = `https://www.qschina.cn/university-rankings/university-subject-rankings/${index}/communication-media-studies`;
    rankUrls.push({ 'year': index, 'url': url });
  }
  return rankUrls;
}
// console.log(getRankUrls());

// 处理排名，去掉等号
// =6 ==> 6
function getRank (str) {
  const regex = /(\d+)/;
  return re(regex, str);
}


function re (regex, str) {
  let m;
  if ((m = regex.exec(str)) !== null) {
    // console.log(m[1]);
    return m[1];
  }
}

async function main () {
  // 写入文件头信息
  let csvHead = '年份,大学名称,分值,排名 \n';
  writeCSVHead(csvHead);
  // 生成历年排名地址
  let rankUrls = getRankUrls();
  // 循环历年数据的抓取、分析和保存
  for (const key in rankUrls) {
    url = rankUrls[key]['url'];
    year = rankUrls[key]['year'];
    // console.log(year, url);
    // 请求原始页面
    await getData(url, {})
      .then((value) => {
        // 得到入口地址
        return getUrl(value);
      })
      .then((value) => {
        // console.log(value);
        // 发起请求，得到数据
        return getData(value);
      })
      .then((value) => {
        // console.log(getDataList(value));
        // getDataList(value);
        // 提取数据
        // console.log(year, url);
        return getDataList(year, value['data']);
      })
      .then((value) => {
        // 写入数据
        // console.log(value);
        writeCSV(value);
      });
  }
}

// 执行主函数
main();

// let url = 'https://www.qschina.cn/university-rankings/university-subject-rankings/2020/communication-media-studies';
// let csvHead = '大学名称,分值,排名 \n';
// writeCSVHead(csvHead);
// // 请求原始页面
// get(url, {})
//   .then((value) => {
//     // 得到入口地址
//     return getUrl(value);
//   })
//   .then((value) => {
//     // console.log(value);
//     // 发起请求，得到数据
//     return get(value);
//   })
//   .then((value) => {
//     // console.log(getDataList(value));
//     // getDataList(value);
//     // 提取数据
//     return getDataList(value['data']);
//   })
//   .then((value) => {
//     // 写入数据
//     console.log(csvHead);
//     writeCSV(value);
//   });
